package game;

/**
 * Classe permettant de creer des cellules avec des coordonnees, un etat et un
 * booleen permettant de savoir si elle a ete traitee
 */
public class Cellule implements Comparable<Object> {
	int posX;
	int posY;
	int etat = 2;
	boolean traite;

	public Cellule() {
		posX = posY = 0;
		traite = false;
	}

	public Cellule(int x, int y) {
		posX = x;
		posY = y;
		traite = false;
	}

	public Cellule(int x, int y, boolean e) {
		posX = x;
		posY = y;
		traite = e;
	}

	@Override
	/**
	 *  Compare deux cellules
	 * @param arg0 : objet a comparer
	 * @return 0, 1 ou -1  
	 */
	public int compareTo(Object arg0) {
		if (arg0 instanceof Cellule) {
			if (((Cellule) arg0).posX == this.posX
					&& ((Cellule) arg0).posY == this.posY) {
				return 0;
			} else if (((Cellule) arg0).posY > this.posY) {
				return -1;
			} else if (((Cellule) arg0).posY == this.posY) {
				if (((Cellule) arg0).posX > this.posX) {
					return 1;
				} else {
					return -1;
				}
			} else {
				return 1;
			}
		}
		return -1;
	}

	public int getPosX() {
		return posX;
	}

	public void setPosX(int posX) {
		this.posX = posX;
	}

	public int getPosY() {
		return posY;
	}

	public void setPosY(int posY) {
		this.posY = posY;
	}

	public int getEtat() {
		return etat;
	}

	public void setEtat(int etat) {
		this.etat = etat;
	}

	/**
	 * isTraite test si la cellule a ete traitee
	 * 
	 * @return true si la cellule a ete traitee, false sinon
	 */
	public boolean isTraite() {
		return traite;
	}

	public void setTraite(boolean traite) {
		this.traite = traite;
	}

	@Override
	/**
	 * Fonction de hachage
	 * @return un entier
	 */
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + posX;
		result = prime * result + posY;
		return result;
	}

	@Override
	/**
	 * Teste si deux cellules sont egales dans le sens d'etre placees au meme endroit
	 * @param obj : cellule a comparer 
	 * @return un booleen : true si les deux cellules sont a la meme position false sinon
	 */
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Cellule other = (Cellule) obj;
		if (posX != other.posX)
			return false;
		if (posY != other.posY)
			return false;
		return true;
	}

	/**
	 * Transforme une cellule en chaine de caractere
	 * 
	 * @return une chaine de caractere decrivant la cellule
	 */
	@Override
	public String toString() {
		return "Cellule [posX=" + posX + ", posY=" + posY + "]" + " etat:"
				+ etat + " " + traite;
	}

}
